package com.study.inoutputStream;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.junit.Test;

/**
* @Name: FileCopyDemo
* @Description: 使用字节流实现文件的拷贝功能
* 字节流四种方式复制文件效率对比：
* 	1、基本文件字节流一次读写一个字节，共耗时：117235ms
* 	2、基本文件字节流一次读写一个字节数组，共耗时：156ms
* 	3、高效字节流一次读写一个字节，共耗时：1141ms
* 	4、高效字节流一次读写一个字节数组，共耗时：47ms
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-15 下午3:19:59 
* @Version: V1.0
 */
public class FileCopyDemo {
	
	/**
	* @Name: fileCopy01
	* @Description: 使用文件字节流实现文件的拷贝功能（每一读取一个字节）
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 下午3:29:34
	* @Parameters: @throws IOException
	* @Return: void 无
	 */
	@Test
	public void fileCopy01() throws IOException{
		//创建文件字节输入流对象
		FileInputStream fis = new FileInputStream("fos2.txt") ;
		//创建文件字节输出流对象
		FileOutputStream fos = new FileOutputStream("copy.txt") ;
		int b = 0 ;
		//读取文件内容：一次读取一个字节内容
		long startTime = System.currentTimeMillis() ;
		while((b = fis.read()) != -1) {
			//将读取到的内容写入到输入流对象指定的文件中
			fos.write(b) ;
		}
		long endTime = System.currentTimeMillis() ;
		System.out.println((endTime-startTime) + "ms");
		//释放资源
		fis.close() ;
		fos.close() ;
	}
	
	/**
	* @Name: fileCopy02
	* @Description: 使用文件字节流实现文件的拷贝功能（每一读取一个字节数组）
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 下午3:29:34
	* @Parameters: @throws IOException
	* @Return: void 无
	 */
	@Test
	public void fileCopy02() throws IOException{
		//创建文件字节输入流对象
		FileInputStream fis = new FileInputStream("E:\\ceshi.avi") ;
		//创建文件字节输出流对象
		FileOutputStream fos = new FileOutputStream("copy2.avi") ;
		byte[] buf = new byte[1024] ;
		int len = 0 ;
		//读取文件内容:一次读取一个字节数组的内容
		long startTime = System.currentTimeMillis() ;
		while((len = fis.read(buf)) != -1) {
			//将读取到的内容写入到输入流对象指定的文件中
			fos.write(buf, 0, len) ;
		}
		long endTime = System.currentTimeMillis() ;
		System.out.println((endTime-startTime) + "ms");
		//释放资源
		fis.close() ;
		fos.close() ;
	}
	
	/**
	* @Name: fileCopy03
	* @Description: 使用高效字节流包装文件字节流实现文件的拷贝功能（每一读取一个字节）
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 下午5:24:04
	* @Parameters: @throws IOException
	* @Return: void
	 */
	@Test
	public void fileCopy03() throws IOException {
		//创建文件字节输入流对象，并包装成高效字节输入流对象
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\ceshi.avi")) ;
		//创建文件字节输出流对象，并包装成高效字节输出流对象
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy3.avi")) ;
		//读取文件内容：每次读取一个字节
		int b = 0;
		long startTime = System.currentTimeMillis() ;
		while((b = bis.read()) != -1) {
			//将读取到的文件内容，拷贝到指定文件
			bos.write(b) ;
		} 
		long endTime = System.currentTimeMillis() ;
		System.out.println((endTime-startTime) + "ms");
		//释放资源
		bis.close() ;
		bos.close() ;
	}
	
	/**
	* @Name: fileCopy04
	* @Description: 使用高效字节流包装文件字节流实现文件的拷贝功能（每一读取一个字节数组）
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 下午5:24:04
	* @Parameters: @throws IOException
	* @Return: void
	 */
	@Test
	public void fileCopy04() throws IOException {
		//创建文件字节输入流对象，并包装成高效字节输入流对象
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\ceshi.avi")) ;
		//创建文件字节输出流对象，并包装成高效字节输出流对象
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy3.avi")) ;
		//读取文件内容：每次读取一个字节数组
		byte[] buf = new byte[1024] ;
		int len = 0 ;
		long startTime = System.currentTimeMillis() ;
		while((len = bis.read(buf)) != -1) {
			//将读取到的文件内容，拷贝到指定文件
			bos.write(buf, 0, len) ;
		}
		long endTime = System.currentTimeMillis() ;
		System.out.println((endTime-startTime) + "ms");
		//释放资源
		bis.close() ;
		bos.close() ;
	}
	
	
}
